<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /*
        1.promise的基本用法
        2.promise出错怎么接收,各种错误的处理
            - try catch
            - reject()
        3.then()方法的参数问题
        4.Promise.all() 和 Promise.race()
        5.await 的执行顺序问题
        6.实现sleep
        7.finally
     */

    /*
       需求设计, 0.  如果没有指定,这每个方法默认停顿1s,初始值为0
               1.   1 3 5 需要1s完成, 1,3,5的结果需要等待上一个的结果,要一个接一个执行
                2.   2 4 6 需要2s完成, 2,4,6的结果互不干扰,需要并发执行
                3.   7需要等待5和(2,4,6)的结果相加
                4.   8方法实现等待指定的毫秒数
                5.   9方法会抛出错误,返回错误的结果需要和步骤3相加
                6.   10为最后的结果,并算出最后需要多少秒,尽量选择最短的时间
     */

    // 方法8 等待n毫秒
    async function fn8(delay = 1000) {
        return new Promise(_ => setTimeout(_, delay))
    }

    // 方法   1 3 5
    function fn1_3_5(value) {
        return value + 1;
    }

    // 方法2 4 6
    function fn2_4_6(value) {
        return value + 2
    }

    // 方法9
    function fn9() {
        return toPromise(10, 1000, true)
    }

    // 公共方法,将普通方法转为promise
    function toPromise(value, delay = 1000, rejected = false) {
        return new Promise((resolve, reject) => setTimeout(rejected ? reject : resolve, delay, value));
    }

    // 初始值为0
    async function run() {
        console.log('开始啦')
        let start = Date.now();
        // 等待 方法1 3 5
        let result1 = await toPromise(fn1_3_5(0))
        console.log('执行完result1:' + (Date.now() - start) + '毫秒')
        let result3 = await toPromise(fn1_3_5(result1))
        console.log('执行完result3:' + (Date.now() - start) + '毫秒')
        let result5 = await toPromise(fn1_3_5(result3))
        console.log('执行完result5:' + (Date.now() - start) + '毫秒')

        let a = Date.now();
        // 执行2 4 6
        let result2_4_6 = await Promise.all([toPromise(fn2_4_6(0), 2000), toPromise(fn2_4_6(0), 2000), toPromise(fn2_4_6(0), 2000)])
        console.log('执行完result2_4_6:' + (Date.now() - start) + '毫秒')
        // 方法7
        let result7 = result1 + result3 + result5 + result2_4_6.reduce((pre, cur) => pre + cur)
        // 得到方法9的值
        let result9 = await fn9().catch(value => value)
        console.log('最后的结果:', result7 + result9)
        console.log('用时:' + (Date.now() - start) + '毫秒')
    }

    // 优化版,暂无
    async function run2() {
        console.log('开始啦')
        let start = Date.now();
        let result1_3_5 = 0;
        let result2_4_6 = []
        // 执行246 并发
        result2_4_6 = await Promise.all(Array(3).fill(2).map(value => toPromise(fn2_4_6(value), 2000)))

        // 执行135
        for (const fn of Array(3).fill(null).map(_ => toPromise)) {
            result1_3_5 = await toPromise(fn1_3_5(result1_3_5))
        }
        console.log('结束啦')
        console.log('用时:' + (Date.now() - start) + '毫秒')
        return 0;

    }

    run2().then(console.log)


</script>
</body>
</html>